package com.dave.gd.core.base.dao;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.support.rowset.SqlRowSet;

import com.dave.gd.core.common.pagehelper.PageInfo;

public interface BaseDao {
    
    void setFirst(int first);
    
    int getFirst();
    
    void setLast(int last);
    
    int getLast();
    
    /**
     * 通过JDBC执行简单SQL更新语句。 （新增、修改、删除等操作）
     * 
     * @param sql
     *            SQL语句
     */
    void jdbcExecute(String sql);
    
    /**
     * 通过JDBC执行SQL更新语句，并返回更新成功记录数。
     * 
     * @param sql
     *            SQL语句
     * @return 返回更新记录数
     */
    int jdbcUpdate(String sql);
    
    /**
     * 通过JDBC执行SQL更新语句，并返回更新成功记录数。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @return 返回更新记录数
     */
    int jdbcUpdate(String sql, Object... args);
    
    /**
     * 通过JDBC执行SQL更新语句，并返回更新成功记录数。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @return 返回更新记录数
     */
    int jdbcUpdate(String sql, Object[] args, int[] argTypes);
    
    /**
     * 通过JDBC执行SQL查询语句，获得整型数据。
     * 
     * @param sql
     *            SQL语句
     * @return 整型数据
     */
    int jdbcQueryForInt(String sql);
    
    /**
     * 通过JDBC执行SQL查询语句，获得整型数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @return 返回整型数据
     */
    int jdbcQueryForInt(String sql, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得整型数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @return 返回整型数据
     */
    int jdbcQueryForInt(String sql, Object[] args, int[] argTypes);
    
    /**
     * 通过JDBC执行SQL查询语句，获得长整型数据。
     * 
     * @param sql
     *            SQL语句
     * @return 长整型数据
     */
    long jdbcQueryForLong(String sql);
    
    /**
     * 通过JDBC执行SQL查询语句，获得长整型数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @return 返回长整型数据
     */
    long jdbcQueryForLong(String sql, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得长整型数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @return 返回长整型数据
     */
    long jdbcQueryForLong(String sql, Object[] args, int[] argTypes);
    
    /**
     * 通过JDBC执行SQL查询语句，获得对象数据。
     * 只能查询单列
     * 
     * @param <E>
     *            返回对象的类型
     * @param sql
     *            SQL语句
     * @param requiredType
     *            对象类型Class
     * @return 返回对象数据
     */
    <E> E jdbcQueryForObject(String sql, Class<E> requiredType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得对象数据。
     * 只能查询单列,查询基础类型
     * 
     * @param <E>
     *            返回对象的类型
     * @param sql
     *            SQL语句
     * @param requiredType
     *            对象类型Class
     * @param args
     *            参数列表
     * @return 返回对象数据
     */
    <E> E jdbcQueryForObject(String sql, Class<E> requiredType, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得对象数据。
     * 只能查询单列,查询基础类型
     * 
     * @param <E>
     *            返回对象的类型
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param requiredType
     *            对象类型Class
     * @return 返回对象数据
     */
    <E> E jdbcQueryForObject(String sql, Object[] args, Class<E> requiredType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得对象数据。
     * 只能查询单列,查询基础类型
     * 
     * @param <E>
     *            返回对象的类型
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @param requiredType
     *            对象类型Class
     * @return 返回对象数据
     */
    <E> E jdbcQueryForObject(String sql, Object[] args, int[] argTypes, Class<E> requiredType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。
     * 只能查询单列,查询基础类型
     * 
     * @param <E>
     *            返回列表的对象类型
     * @param sql
     *            SQL语句
     * @param elementType
     *            对象类型Class
     * @return 返回数据列表
     */
    <E> List<E> jdbcQueryForList(String sql, Class<E> elementType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。
     * 只能查询单列,查询基础类型
     * 
     * @param <E>
     *            返回列表的对象类型
     * @param sql
     *            SQL语句
     * @param elementType
     *            对象类型Class
     * @param args
     *            参数列表
     * @return 返回数据列表
     */
    <E> List<E> jdbcQueryForList(String sql, Class<E> elementType, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。
     * 只能查询单列,查询基础类型
     * 
     * @param <E>
     *            返回列表的对象类型
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param elementType
     *            对象类型Class
     * @return 返回数据列表
     */
    <E> List<E> jdbcQueryForList(String sql, Object[] args, Class<E> elementType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。
     * 
     * @param <E>
     *            返回列表的对象类型
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @param elementType
     *            对象类型Class
     * @return 返回数据列表
     */
    <E> List<E> jdbcQueryForList(String sql, Object[] args, int[] argTypes, Class<E> elementType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。
     * 
     * @param <E>
     *            返回列表的对象类型
     * @param sql
     *            SQL语句
     * @param elementType
     *            对象类型Class
     * @return 返回数据列表
     */
    <E> List<E> jdbcFindList(final String sql, final Class<E> elementType);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。
     * 
     * @param <E>
     *            返回列表的对象类型
     * @param sql
     *            SQL语句
     * @param elementType
     *            对象类型Class
     * @param params
     *            参数列表
     * @return 返回数据列表
     */
    <E> List<E> jdbcFindList(final String sql, final Class<E> elementType, final List<Object> params);
    
    /**
     * 通过JDBC执行SQL查询语句，获取数据总数。
     * 
     * @param sql
     *            SQL语句
     * @param params
     *            参数列表
     * @return 返回数据总数
     */
    int jdbcGetSize(String sql, List<Object> params);
    
    /**
     * 通过JDBC执行SQL查询语句，获取分页信息。
     * 
     * @param <E>
     *            实体类型
     * @param sql
     *            SQL语句
     * @param elementType
     *            实体Class
     * @param currentPage
     *            当前页码
     * @param perPageNum
     *            每页记录数
     * @return 分页信息
     */
    <E> PageInfo jdbcFindPageInfo(String sql, Class<E> elementType, int currentPage, int perPageNum);
    
    /**
     * 通过JDBC执行SQL查询语句，获取分页信息。
     * 
     * @param <E>
     *            实体类型
     * @param sql
     *            SQL语句
     * @param elementType
     *            元素类型
     * @param params
     *            参数列表
     * @param currentPage
     *            当前页码
     * @param perPageNum
     *            每页记录数
     * @return 分页信息
     */
    <E> PageInfo jdbcFindPageInfo(String sql, Class<E> elementType, List<Object> params,
        int currentPage, int perPageNum);
    
    /**
     * 通过JDBC执行SQL查询语句，获得key-value样式Map数据。
     * 
     * @param sql
     *            SQL语句
     * @return 返回Map数据
     */
    Map<String, Object> jdbcQueryForMap(String sql);
    
    /**
     * 通过JDBC执行SQL查询语句，获得key-value样式Map数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @return 返回Map数据
     */
    Map<String, Object> jdbcQueryForMap(String sql, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得key-value样式Map数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @return 返回Map数据
     */
    Map<String, Object> jdbcQueryForMap(String sql, Object[] args, int[] argTypes);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。 并非返回特定某个对象，而是返回具有key-value样式的表格数据。
     * 
     * @param sql
     *            SQL语句
     * @return 返回数据列表
     */
    List<Map<String, Object>> jdbcQueryForList(String sql);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。 并非返回特定某个对象，而是返回具有key-value样式的表格数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @return 返回数据列表
     */
    List<Map<String, Object>> jdbcQueryForList(String sql, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据列表。 并非返回特定某个对象，而是返回具有key-value样式的表格数据。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @return 返回数据列表
     */
    List<Map<String, Object>> jdbcQueryForList(String sql, Object[] args, int[] argTypes);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据结果集。
     * 
     * @param sql
     *            SQL语句
     * @return 返回数据列表
     */
    SqlRowSet jdbcQueryForRowSet(String sql);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据结果集。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @return 返回数据列表
     */
    SqlRowSet jdbcQueryForRowSet(String sql, Object... args);
    
    /**
     * 通过JDBC执行SQL查询语句，获得数据结果集。
     * 
     * @param sql
     *            SQL语句
     * @param args
     *            参数列表
     * @param argTypes
     *            参数类型列表
     * @return 返回数据列表
     */
    SqlRowSet jdbcQueryForRowSet(String sql, Object[] args, int[] argTypes);
    
}
